package com.likou;


import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode() {}
 * ListNode(int val) { this.val = val; }
 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
public class Q2 {
    // public static void main(String[] args) {
    //     Q2 q2 = new Q2();
    //     q2.addTwoNumbers()
    // }

    // public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    //     // 存数据
    //     List<Integer> list1 = new LinkedList<>();
    //     List<Integer> list2 = new LinkedList<>();
    //     List<Integer> list3 = new LinkedList<>();
    //
    //
    //     // 取数据
    //     while (l1 != null) {
    //         list1.add(l1.val);
    //         l1 = l1.next;
    //     }
    //     while (l2 != null) {
    //         list2.add(l2.val);
    //         l2 = l2.next;
    //     }
    //
    //     // System.out.println(list1);
    //     // System.out.println(list2);
    //
    //     // 反向对位相加
    //     int mark = 0;
    //     int rs;
    //     int yu;
    //     int i = 0;
    //     for (; i < Math.min(list1.size(), list2.size()); i++) {
    //         rs = list1.get(i) + list2.get(i) + mark;
    //         if (rs >= 10) {
    //             yu = rs % 10;
    //             list3.add(yu);
    //             mark = 1;
    //         } else {
    //             list3.add(rs);
    //             mark = 0;
    //         }
    //     }
    //
    //     // 存放后面的数字
    //     for (; i < Math.max(list1.size(), list2.size()); i++) {
    //         // 判断哪个大
    //         if (Math.max(list1.size(), list2.size()) == list1.size()) {
    //             rs = list1.get(i) + mark;
    //             if (rs >= 10) {
    //                 yu = rs % 10;
    //                 list3.add(yu);
    //                 mark = 1;
    //             } else {
    //                 list3.add(rs);
    //                 mark = 0;
    //             }
    //         } else {
    //             rs = list2.get(i) + mark;
    //             if (rs >= 10) {
    //                 yu = rs % 10;
    //                 list3.add(yu);
    //                 mark = 1;
    //             } else {
    //                 list3.add(rs);
    //                 mark = 0;
    //             }
    //         }
    //     }
    //
    //     if (mark == 1) {
    //         list3.add(mark);
    //     }
    //     // System.out.println(list3);
    //
    //     // 封装成链表ListNode 对象，尾插法
    //     ListNode listNode = new ListNode();
    //     ListNode r;
    //     r = listNode;
    //     for (int j = 0; j < list3.size(); j++) {
    //         r.val = list3.get(j);
    //         // 最后一个数字则不插入对象了
    //         if (j != (list3.size() - 1)) {
    //             r.next = new ListNode();
    //             r = r.next;
    //         }
    //     }
    //
    //     return listNode;
    // }

    // 方法：模拟
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null, tail = null;
        int carry = 0;
        while (l1 != null || l2 != null) {
            int n1 = l1 != null ? l1.val : 0;
            int n2 = l2 != null ? l2.val : 0;
            int sum = n1 + n2 + carry;
            if (head == null) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }
            carry = sum / 10;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            tail.next = new ListNode(carry);
        }
        return head;
    }

}

class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}
